Fellow Travellers

WebApp 开发简单入门

肖健
字数统计: 1.3k阅读时长: 7 min
2018/11/02 Share

一、概述

目前市面的移动应用很多大致分为三类:

   1.Native_App: 原生APP 具有最佳用户体验、可访问本地资源,调用移动硬件设备。

   2.Hybrid_App:混合APP 

   3.Web_App :  基于web系统和应用,运行于网络和浏览器之上,具备无需要安装包、节约手机空间、低成本开发的优势。

   4.其他:wep_app、uni_app等。

二、WebApp开发基础准备

  1.知识储备:HTML/HTML5、CSS/CSS3基础知识,了解JS开发。
  推荐学习网站:http://www.w3school.com.cn/h.asp


2.开发工具:VS Code 、webStorm、HBuilderX 等...

三、开发实例:以 HBuilderX 为开发工具

1. webapp目录结构:

2. webapp运行流程:

3. webapp运行效果:

4. 实现代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
<title>Relationship Renderer</title>

html代码中最关键的就是meta标签设置,开发移动端页面首先一定要设置viewport 
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />

device-width - 设备的宽度
initial-scale - 初始的缩放比例  
minimum-scale - 允许用户缩放到的最小比例   
maximum-scale - 允许用户缩放到的最大比例  
user-scalable - 用户是否可以手动缩放 

<link rel="stylesheet" href="https://js.arcgis.com/3.26/esri/css/esri.css">
<link rel="stylesheet" href="https://js.arcgis.com/3.26/dijit/themes/claro/claro.css">

<style>
  html, body, #map {
    padding: 0;
    margin: 0;
    height: 100%;
    width: 100%;
  }
  #menuDiv{
    z-index: 65;
    top: 0px;
    right: 0px;
    position: absolute;
    max-width: 280px;
    opacity: 0.9;
    background-color: whitesmoke;
    padding: 10px;
  }
</style>

<script>
  var dojoConfig = {
    has: {
      "esri-featurelayer-webgl": 1
    }
  };
</script>

<script src="https://js.arcgis.com/3.26/"></script>

<script>
require([
    "esri/map",
    "esri/layers/FeatureLayer",
    "esri/renderers/smartMapping",
    "esri/styles/relationship",
    "esri/dijit/Legend",
    "esri/dijit/PopupTemplate",
    "dojo/domReady!"
  ],
  function(
    Map,
    FeatureLayer,
    smartMapping,
    relationshipStyles,
    Legend,
    PopupTemplate
  ) {

    // create relationship Renderer

    var map = new Map("map", {
      basemap: "gray",
      center: [-97.29614, 19.54323],
      zoom: 7
    });

    var url = "https://services.arcgis.com/V6ZHFr6zdgNZuVG0/ArcGIS/rest/services/Mexico_demographics/FeatureServer/0";

    // Create new feature layer pointing to service with educational
    // attainment data by city and assigns it a PopupTemplate

    var layer = new FeatureLayer(url, {
      outFields: [ "NAME", "EDUC01_CY", "EDUCA_BASE", "AVGHHSZ_CY" ],
      infoTemplate: new PopupTemplate({
        title: "{NAME}",
        description: "{EDUC01_CY} people in this municipality didn't complete any formal education.",
        fieldInfos: [{
          fieldName: "EDUC01_CY",
          label: "Population without formal education",
          format: { places: 0, digitSeparator: true }
        }, {
          fieldName: "EDUCA_BASE",
          label: "Total population"
        }, {
          fieldName: "AVGHHSZ_CY",
          label: "Average household size"
        }]
      })
    });

    // Add the layer to the map
    map.addLayer(layer);
    map.on("load", selectFields);

    var relationshipParams;

    /**
     * Sets the remaining parameters for the renderer and selects the
     * fields to use for generating predominance based on the selection
     * from the drop down menu.
     */
    function selectFields(){

      relationshipParams = {
        field1: {
          field: "EDUC01_CY",
          normalizationField: "EDUCA_BASE"
        },
        field2: {
          field: "AVGHHSZ_CY"
        },
        layer: layer,
        basemap: map.getBasemap(),
        classificationMethod: "natural-breaks",
        numClasses: 3,
        showOthers: false,
        focus: "HH"  // rotates the legend like a diamond. Set to null to make it a square
      };

      var schemes = relationshipStyles.getSchemes({
        theme: "default",
        basemap: "gray",
        geometryType: "polygon",
        numColors: relationshipParams.numClasses
      });

      addOptions(schemes);

      // Creates the predominance renderer
      smartMapping.createRelationshipRenderer(relationshipParams)
        .then(applyRenderer);
    }

    /**
     * Creates the select for changing the color scheme.
     */
    function addOptions(schemes){
      var selectElem = document.getElementById("schemes");

      var option = document.createElement("option");
      option.value = "primary";
      option.text = "primary";
      selectElem.appendChild(option);

      var secondarySchemes = schemes.secondarySchemes;
      var primaryScheme = schemes.primaryScheme;

      secondarySchemes.forEach(function(scheme, i){
        var option = document.createElement("option");
        option.value = i;
        option.text = "secondary " + (i+1);
        selectElem.appendChild(option);
      });

      selectElem.addEventListener("change", function(event){
        var selection = event.target.value;
        relationshipParams.scheme = selection === "primary" ? primaryScheme : secondarySchemes[parseInt(selection)];
        smartMapping.createRelationshipRenderer(relationshipParams)
          .then(applyRenderer);
      });
    }

    // Create a legend

    var legend = new Legend({
      map: map,
      layerInfos: [{
        layer: layer,
        title: "Mexico Educational Attainment"
      }]
    }, "legendDiv");
    legend.startup();

    var showDescriptiveLabelsElement = document.getElementById("descriptive-labels");

    showDescriptiveLabelsElement.addEventListener("change", function(event){
      var renderer = changeRendererLabels(layer.renderer, showDescriptiveLabelsElement.checked);
      layer.setRenderer(renderer);
      layer.redraw();
      legend.refresh();
    });

    // Applies the generated renderer to the feature layer
    function applyRenderer(response){

      var renderer = changeRendererLabels(response.renderer, showDescriptiveLabelsElement.checked);
      layer.setRenderer(renderer);
      layer.redraw();

      if(!layer.visible){
        layer.setVisibility(true);
      }

      legend.refresh();
    }

    /**
     * Changes the labels and orientation of the relationship legend.
     *
     * @param {module:esri/renderers/UniqueValueRenderer} renderer - An instance of a relationship renderer.
     * @param {boolean} showDescriptiveLabels - Indicates whether to orient the legend as a diamond and display
     *   descriptive labels. If `false`, then the legend is oriented as a square with numeric labels, similar to
     *   a chart with an x/y axis.
     *
     * @return {renderer} - The input renderer with the modified descriptions and orientation.
     */
    function changeRendererLabels(renderer, showDescriptiveLabels){

      var numClasses = renderer.authoringInfo.numClasses;
      var field1max = renderer.authoringInfo.field1.classBreakInfos[ numClasses-1 ].maxValue;
      var field2max = renderer.authoringInfo.field2.classBreakInfos[ numClasses-1 ].maxValue;

      renderer.infos.forEach(function(info){
        switch (info.value) {
          case "HH":
            info.label = showDescriptiveLabels ? "Large Households<br>Not formally educated" : "";
            break;
          case "HL":
            info.label = showDescriptiveLabels ? "Small Households<br>Not much education" : Math.round(field1max * 100) + "%";
            break;
          case "LH":
            info.label = showDescriptiveLabels ? "Large Households<br>Formally educated" : field2max;
            break;
          case "LL":
            info.label = showDescriptiveLabels ? "Small Households<br>Not formally educated" : 0;
            break;
        }
      });

      renderer.authoringInfo.focus = showDescriptiveLabels ? "HH" : null;

      return renderer;
    }
  });
</script>
</head>

<body class="claro">
  <div id="map"></div>
  <div id="menuDiv">
    <div id="legendDiv"></div>
    <div id="select-div">
      <input type="checkbox" id="descriptive-labels" checked> Show descriptive labels<br>
      Switch color scheme: <select id="schemes"></select>
    </div>
  </div>
</body>

</html>

5. webapp打包:

打包注意事项:

小结:webapp开发上手还是挺快的,主要还是需要熟悉掌握html5、js、css语法。

CATALOG
  1. 1. 一、概述
  2. 2. 二、WebApp开发基础准备
  3. 3. 三、开发实例:以 HBuilderX 为开发工具
    1. 3.1. 1. webapp目录结构:
    2. 3.2. 2. webapp运行流程:
    3. 3.3. 3. webapp运行效果:
    4. 3.4. 4. 实现代码:
    5. 3.5. 5. webapp打包:
      1. 3.5.1. 小结:webapp开发上手还是挺快的,主要还是需要熟悉掌握html5、js、css语法。